\chapter{OpenGL ES 2.0}\label{chap:OpenGLES20}
Für die Prozesse auf der \gls{GPU} wird für dieses Projekt \gls{OpenGL ES} 2.0 eingesetzt. Damit ist es möglich, über die \gls{API} auf die standardisierte Pipeline von \gls{OpenGL ES} 2.0 zuzugreifen. In der Abbildung \ref{fig:OpenGLESGraphicsPipeline} ist diese dargestellt.
\begin{figure}[!h]
\centering
%\scalebox{0.5}{\input{fig/ogles_pipe.tkz}}
\input{fig/ogles_pipe.tkz}
\caption{OpenGL ES 2.0 Graphics Pipeline. Quelle: Aaftab, 2009 \cite{Aaftab2009}, S. 4.}
\label{fig:OpenGLESGraphicsPipeline}
\end{figure}\\
Über die \gls{API} kann auf die \textit{Vertex Arrays / Buffer Objects}, den \textit{Vertex Shader} und die \textit{Texuture Memory} zugegriffen werden. Der \textit{Vertex Shader} verwendet Attribute, Uniforms, Samplers und \textit{Shader Program} für die Berechnung von Varyings. Die Fachbegriffe sind in der Tabelle \ref{tab:FachbegriffeVertex} erklärt. Der \textit{Vertex Shaders} ist in Abbildung \ref{fig:OpenGLESVertexShader} schematisch dargestellt.\\
\begin{table}[!h]
\centering
\begin{tabular}{|l|l|}
\hline
\textbf{Name} & \textbf{Beschreibung}\\
\hline
Attribute & Array für die Berechnung von Positionen und Koordinaten.\\
Uniforms & Konstanten. Vom Vertex und \textit{} verwendet.\\
Samplers & Spezielle Art von Uniforms für die Abbildung von Texturen.\\
Shader program & Sourcecode oder kompilierte Form für die Beschreibung der\\
 & durchzuführenden Operationen.\\
Varying & Variablen, um einzelne Fragmente zu interpolieren;\\
 & wird von Fragement Shader verwendet.\\
\hline
\end{tabular}
\caption{Fachbegriffe für den Vertex Shader}
\label{tab:FachbegriffeVertex}
\end{table}
\begin{figure}[!h]
\centering
\includegraphics[width=0.5\textwidth]{fig/VertexShader}
\caption{OpenGL ES 2.0 Vertex Shader. Quelle: Aaftab, 2009 \cite{Aaftab2009}, S. 5.}
\label{fig:OpenGLESVertexShader}
\end{figure}\\
Der \textit{Vertex Shader} wird für Berechnungen von Positionstransformationen durch eine Matrix, Lösen von Gleichungen zur Beleuchtung oder die Transformation der Textur-Koordinaten eingesetzt.
\\
Varyings werden über das \textit{Primitive Assembly} und die \textit{Rasterization} des \textit{Fragment Shaders} verwendet. Eine \textit{Primitive} ist ein geometrisches Objekt mit den Attributen des \textit{Vertex Shaders}. Diese Attribute enthalten die Informationen für die Berechnung der Position und Farbe eines \textit{Fragments}. Die \textit{Rasterization} konvertiert die Primitive in ein zweidimensionales \textit{Fragment}. Das generierte \textit{Fragment} wird vom \textit{Fragment Shader} bearbeitet. In der Abbildung \ref{fig:OpenGLESFragmentShader} ist der \textit{Fragment Shader} dargestellt.
\begin{figure}[!h]
\centering
\includegraphics[width=0.5\textwidth]{fig/FragmentShader}
\caption{OpenGL ES 2.0 Fragment Shader. Quelle: Aaftab, 2009 \cite{Aaftab2009}, S. 8.}
\label{fig:OpenGLESFragmentShader}
\end{figure}
Er bearbeitet jedes einzelne generierte Fragment. Die \textit{Varying} Variable wurde vom \textit{Primitive Assembly} und der \textit{Rasterization} bearbeitet. Im \textit{Fragment Shader} werden die Operationen für ein generiertes \textit{Fragment} durchgeführt. Es kann ein \textit{Fragment} verworfen oder eine Farbe geändert werden. Nebst den dargestellten Attributen hat der \textit{Fragment Shader} Zugriff auf die \textit{Texture Memory}. Er kann für die Berechnung des generierten \textit{Fragments} weitere Daten von der \textit{Texture Memory} laden.\\
\\
Für die Entwicklung der \gls{OpenGL ES} 2.0 Pipeline müssen folgende Schritte durchgeführt werden:
\begin{itemize}
\item Erstellen des \textit{Vertex Shaders}
\item Erstellen des \textit{Fragment Shaders}
\item \textit{Shader} kompilieren und laden
\item Erstellen des \textit{Program Objects}
\item \textit{Shader} linken
\item Setzen vom \textit{Viewport}
\item Löschen vom \textit{Color Buffer}
\item Laden von Geometrien und Zeichnungen
\item Anzeigen des \textit{Buffers}
\end{itemize}
Zur Erstellung vom \textit{Vertex} und \textit{Fragment Shader} können Sourcecode Daten oder vorkompilierte Dateien geladen werden. Für die vorliegende Arbeit wurde die Variante mit dem Sourcecodeladen während der Laufzeit gewählt. Die Programmiersprache für den Shader ist abgeleitet von der Sprache C. Weitere Datentypen kommen hinzu. Für das Projekt relevante Typen sind in der Tabelle \ref{tab:DatatypesOpenGL} zusammenstellt:
\begin{table}[!h]
\centering
\begin{tabular}{|l|l|}
\hline
\textbf{Datentyp} & \textbf{Beschreibung}\\
\hline
float & Skalarer Floating Point\\
vec2 & Vektor, nimmt zwei Floating Point Werte auf.\\
vec4 & Vektor, nimmt vier Floating Point Werte auf.\\
gl\_Position & Eingebautes Varying. Vordefinierte Deklaration.\\
gl\_FragColor & Ausgabe Fragment Shader. Vordefinierte Deklaration.\\
\hline
\end{tabular}
\caption{Relevante Datentypen für das Projekt}
\label{tab:DatatypesOpenGL}
\end{table}
Der \textit{Vertex Shader} muss der \textit{gl\_Position} die transformierte Position zuweisen. Der \textit{Fragment Shader} übergibt das berechnete neue Texel an \textit{gl\_FragColor}. Im Kapitel \ref{sec:cpuRendering} ab Seite \pageref{sec:cpuRendering} ist der Sourcecode für den \textit{Vertex} und \textit{Fragment Shader} abgebildet. Die Funktionsweise vom \textit{Per-Fragment} und \textit{Framebuffer Operations} sowie die Grundlagen sind aus dem Buch OpenGL ES 2.0 Programming Guide \cite{Aaftab2009}.

